package com.yanqu.xiuxian.crosssystem.manger.elementalbonds.logic;

import com.yanqu.xiuxian.config.elementalbonds.ElementalBondsConfigMgr;
import com.yanqu.xiuxian.config.elementalbonds.ElementalBondsSceneConfig;
import com.yanqu.xiuxian.config.elementalbonds.enums.*;
import com.yanqu.xiuxian.crosssystem.manger.elementalbonds.data.ElementalBondsGameData;
import com.yanqu.xiuxian.crosssystem.manger.elementalbonds.data.ElementalBondsPlayerData;
import com.yanqu.xiuxian.crosssystem.manger.elementalbonds.entity.ElementalBondsBlock;
import com.yanqu.xiuxian.crosssystem.manger.elementalbonds.entity.ElementalBondsBlockEffect;
import com.yanqu.xiuxian.crosssystem.manger.elementalbonds.enums.ElementalBondsSceneType;
import com.yanqu.xiuxian.crosssystem.manger.elementalbonds.param.ElementalBondsSkillParam;
import com.yanqu.xiuxian.crosssystem.manger.elementalbonds.result.ElementalBondsOperateResult;
import com.yanqu.xiuxian.crosssystem.manger.elementalbonds.result.ElementalBondsOperateStageResult;
import com.yanqu.xiuxian.server.protocol.GameErrorCode;

import java.util.*;

public class ElementalBondsSceneLogic {

    public static void turnChangeRefresh(Random random, ElementalBondsGameData elementalBondsGameData, ElementalBondsOperateResult elementalBondsOperateResult) {
        ElementalBondsSceneConfig elementalBondsSceneConfig = ElementalBondsConfigMgr.getInstance().getSceneConfigMap().get(elementalBondsGameData.getSceneId());
        // 检查配置
        if (elementalBondsSceneConfig == null) {
            elementalBondsOperateResult.setRet(GameErrorCode.E_ELEMENTAL_BONDS_SCENE_CONFIG_NO_EXIST);
            return;
        }

        ElementalBondsSceneType elementalBondsSceneType = ElementalBondsSceneType.forType(elementalBondsGameData.getSceneId());
        elementalBondsSceneType.refresh(elementalBondsSceneConfig, elementalBondsGameData, elementalBondsOperateResult, random);
    }

    public static void beginGameInit(Random random, ElementalBondsGameData elementalBondsGameData, ElementalBondsOperateResult elementalBondsOperateResult) {
        ElementalBondsSceneConfig elementalBondsSceneConfig = ElementalBondsConfigMgr.getInstance().getSceneConfigMap().get(elementalBondsGameData.getSceneId());
        // 检查配置
        if (elementalBondsSceneConfig == null) {
            elementalBondsOperateResult.setRet(GameErrorCode.E_ELEMENTAL_BONDS_SCENE_CONFIG_NO_EXIST);
            return;
        }

        ElementalBondsSceneType elementalBondsSceneType = ElementalBondsSceneType.forType(elementalBondsGameData.getSceneId());
        elementalBondsSceneType.init(elementalBondsSceneConfig, elementalBondsGameData, elementalBondsOperateResult, random);
    }

    public static void operateEnd(Random random, ElementalBondsGameData elementalBondsGameData, ElementalBondsOperateResult elementalBondsOperateResult) {
        ElementalBondsSceneConfig elementalBondsSceneConfig = ElementalBondsConfigMgr.getInstance().getSceneConfigMap().get(elementalBondsGameData.getSceneId());
        // 检查配置
        if (elementalBondsSceneConfig == null) {
            elementalBondsOperateResult.setRet(GameErrorCode.E_ELEMENTAL_BONDS_SCENE_CONFIG_NO_EXIST);
            return;
        }

        ElementalBondsSceneType elementalBondsSceneType = ElementalBondsSceneType.forType(elementalBondsGameData.getSceneId());
        elementalBondsSceneType.operateEnd(elementalBondsSceneConfig, elementalBondsGameData, elementalBondsOperateResult, random, true);
    }

    public static void afterSameColorEliminate(ElementalBondsGameData elementalBondsGameData, Set<ElementalBondsBlock> elementalBondsBlockSet,
                                               ElementalBondsOperateStageResult elementalBondsOperateStageResult, ElementalBondsOperateType elementalBondsOperateType) {
        ElementalBondsSceneConfig elementalBondsSceneConfig = ElementalBondsConfigMgr.getInstance().getSceneConfigMap().get(elementalBondsGameData.getSceneId());
        // 检查配置
        if (elementalBondsSceneConfig == null) {
            return;
        }

        ElementalBondsSceneType elementalBondsSceneType = ElementalBondsSceneType.forType(elementalBondsGameData.getSceneId());
        elementalBondsSceneType.afterSameColorEliminate(elementalBondsSceneConfig, elementalBondsGameData,
                elementalBondsOperateStageResult, elementalBondsBlockSet, elementalBondsOperateType);
    }

    public static void replaceDropBlock(Random random, ElementalBondsGameData elementalBondsGameData, List<ElementalBondsBlock> elementalBondsBlockList) {
        ElementalBondsSceneConfig elementalBondsSceneConfig = ElementalBondsConfigMgr.getInstance().getSceneConfigMap().get(elementalBondsGameData.getSceneId());
        // 检查配置
        if (elementalBondsSceneConfig == null) {
            return;
        }

        ElementalBondsSceneType elementalBondsSceneType = ElementalBondsSceneType.forType(elementalBondsGameData.getSceneId());
        elementalBondsSceneType.replaceDropBlock(elementalBondsSceneConfig, elementalBondsGameData, elementalBondsBlockList, random);
    }

    public static void eliminateEnd(ElementalBondsGameData elementalBondsGameData, ElementalBondsPlayerData elementalBondsPlayerData,
                                    ElementalBondsOperateResult elementalBondsOperateResult, Random random,int roomRound, int turnPlayer) {
        ElementalBondsSceneConfig elementalBondsSceneConfig = ElementalBondsConfigMgr.getInstance().getSceneConfigMap().get(elementalBondsGameData.getSceneId());
        // 检查配置
        if (elementalBondsSceneConfig == null) {
            elementalBondsOperateResult.setRet(GameErrorCode.E_ELEMENTAL_BONDS_SCENE_CONFIG_NO_EXIST);
            return;
        }

        ElementalBondsSceneType elementalBondsSceneType = ElementalBondsSceneType.forType(elementalBondsGameData.getSceneId());
        elementalBondsSceneType.eliminateEnd(elementalBondsSceneConfig, elementalBondsGameData, elementalBondsPlayerData,
                elementalBondsOperateResult, random, roomRound, turnPlayer);
    }

    public static int scene_06_getEliminateNum() {
        return ElementalBondsConfigMgr.getInstance().getSceneConfigMap().get(ElementalBondsSceneType.GUI_KE_ZHAN_BU.getType()).getParamList().get(2);
    }

    public static int scene_07_checkChooseBlock(ElementalBondsGameData elementalBondsGameData, ElementalBondsSkillParam elementalBondsSkillParam, boolean checkTo) {
        if (elementalBondsGameData.getSceneId() == ElementalBondsSceneType.BAI_BAO_XIANG.getType()) {
            List<Integer> xList = new ArrayList<>();
            List<Integer> yList = new ArrayList<>();
            xList.add(elementalBondsSkillParam.getFromX());
            yList.add(elementalBondsSkillParam.getFromY());
            if (checkTo) {
                xList.add(elementalBondsSkillParam.getToX());
                yList.add(elementalBondsSkillParam.getToY());
            }

            List<List<ElementalBondsBlock>> blockList = elementalBondsGameData.getBlockList();
            for (int i = 0; i < xList.size(); i++) {
                int x = xList.get(i);
                int y = yList.get(i);
                if (!ElementalBondsBlockLogic.exist(blockList, x, y)) {
                    return GameErrorCode.E_ELEMENTAL_BONDS_POS_NO_EXIST;
                }
                if (blockList.get(y).get(x).getElementalBondsBlockType() == ElementalBondsBlockType.BAI_BAO_XIANG) {
                    return GameErrorCode.E_ELEMENTAL_BONDS_BLOCK_CAN_NOT_CHOOSE;
                }
            }
        }
        return GameErrorCode.E_SUCCESS_VALUE;
    }

    public static void scene_08_fixColor(ElementalBondsGameData elementalBondsGameData, ElementalBondsOperateResult elementalBondsOperateResult) {
        if (elementalBondsGameData.getSceneId() != ElementalBondsSceneType.HONG_YOU_QING_HUA.getType()) {
            return;
        }

        int blue = elementalBondsOperateResult.getTurn() == 1 ? ElementalBondsColorType.RED.getType() : ElementalBondsColorType.BLUE.getType();
        int red = elementalBondsOperateResult.getTurn() == 1 ? ElementalBondsColorType.BLUE.getType() : ElementalBondsColorType.RED.getType();

        // 先全部变蓝色
        Set<ElementalBondsBlock> changeSet1 = new HashSet<>();
        List<List<ElementalBondsBlock>> blockList = elementalBondsGameData.getBlockList();
        for (List<ElementalBondsBlock> elementalBondsBlockList : blockList) {
            for (ElementalBondsBlock elementalBondsBlock : elementalBondsBlockList) {
                if (elementalBondsBlock.getElementalBondsBlockType() == ElementalBondsBlockType.HONG_YOU_QING_HUA) {
                    elementalBondsBlock.setColor(blue);
                    changeSet1.add(elementalBondsBlock);
                }
            }
        }

        // 蓝色无法消除的全部变红色
        Set<ElementalBondsBlock> changeSet2 = new HashSet<>();
        for (ElementalBondsBlock elementalBondsBlock : changeSet1) {
            if (!ElementalBondsEliminateLogic.canSameColorEliminate(blockList, elementalBondsBlock)) {
                elementalBondsBlock.setColor(red);
                changeSet2.add(elementalBondsBlock);
            }
        }

        // 红色无法消除的变回蓝色
        for (ElementalBondsBlock elementalBondsBlock : changeSet2) {
            if (!ElementalBondsEliminateLogic.canSameColorEliminate(blockList, elementalBondsBlock)) {
                elementalBondsBlock.setColor(blue);
            }
        }
    }

    public static void scene_08_changeColor(ElementalBondsGameData elementalBondsGameData, int color) {
        if (elementalBondsGameData.getSceneId() != ElementalBondsSceneType.HONG_YOU_QING_HUA.getType()) {
            return;
        }
        if (color != ElementalBondsColorType.RED.getType() && color != ElementalBondsColorType.BLUE.getType()) {
            return;
        }

        for (List<ElementalBondsBlock> elementalBondsBlockList : elementalBondsGameData.getBlockList()) {
            for (ElementalBondsBlock elementalBondsBlock : elementalBondsBlockList) {
                if (elementalBondsBlock.getElementalBondsBlockType() == ElementalBondsBlockType.HONG_YOU_QING_HUA) {
                    elementalBondsBlock.setColor(color);
                }
            }
        }
    }

    public static int scene_09_getAddStepNum() {
        return ElementalBondsConfigMgr.getInstance().getSceneConfigMap().get(ElementalBondsSceneType.DIAN_SHAN_LEI_MING.getType()).getParamList().get(2);
    }

    public static boolean scene_12_checkEffectChange(ElementalBondsBlock elementalBondsBlock, ElementalBondsGameData elementalBondsGameData) {
        if (elementalBondsGameData.getSceneId() == ElementalBondsSceneType.WU_CAI_BIN_FEN.getType()) {
            List<ElementalBondsBlockEffect> elementalBondsBlockEffectList = elementalBondsBlock.getElementalBondsBlockEffectList();

            if (elementalBondsBlock.getColor() == elementalBondsGameData.getScene12Color() &&
                    (elementalBondsBlock.getElementalBondsBlockType().getBigType() == ElementalBondsBlockBigType.NORMAL ||
                            elementalBondsBlock.getElementalBondsBlockType().getBigType() == ElementalBondsBlockBigType.NORMAL_BOMB)) {
                // 添加
                if (elementalBondsBlockEffectList.stream().noneMatch(elementalBondsBlockEffect -> elementalBondsBlockEffect.getEffectType() == ElementalBondsBlockEffectType.WU_CAI_BIN_FEN)) {
                    elementalBondsBlock.addElementalBondsBlockEffect(new ElementalBondsBlockEffect(ElementalBondsBlockEffectType.WU_CAI_BIN_FEN, elementalBondsGameData.getScene12Score()));
                    return true;
                }
            } else {
                // 移除
                boolean change = false;
                for (int i = 0; i < elementalBondsBlockEffectList.size(); i++) {
                    if (elementalBondsBlockEffectList.get(i).getEffectType() == ElementalBondsBlockEffectType.WU_CAI_BIN_FEN) {
                        elementalBondsBlockEffectList.remove(i--);
                        change = true;
                    }
                }
                return change;
            }
        }
        return false;
    }

}
